GtkPointerFocus *focus;
focus = g_new0 (GtkPointerFocus, 1);
+ focus->ref_count = 1;
focus->toplevel = toplevel;
focus->device = device;
focus->sequence = sequence;
return focus;
}
+GtkPointerFocus *
+gtk_pointer_focus_ref (GtkPointerFocus *focus)
+{
+ focus->ref_count++;
+ return focus;
+}
+
void
-gtk_pointer_focus_free (GtkPointerFocus *focus)
+gtk_pointer_focus_unref (GtkPointerFocus *focus)
{
- gtk_pointer_focus_set_target (focus, NULL);
- gtk_pointer_focus_set_implicit_grab (focus, NULL);
- g_free (focus);
+ focus->ref_count--;
+
+ if (focus->ref_count == 0)
+ {
+ gtk_pointer_focus_set_target (focus, NULL);
+ gtk_pointer_focus_set_implicit_grab (focus, NULL);
+ g_free (focus);
+ }
}
void
struct _GtkPointerFocus
{
+ gint ref_count;
GdkDevice *device;
GdkEventSequence *sequence;
GtkWindow *toplevel;
GdkEventSequence *sequence,
gdouble x,
gdouble y);
-void gtk_pointer_focus_free (GtkPointerFocus *focus);
+GtkPointerFocus * gtk_pointer_focus_ref (GtkPointerFocus *focus);
+void gtk_pointer_focus_unref (GtkPointerFocus *focus);
void gtk_pointer_focus_set_coordinates (GtkPointerFocus *focus,
gdouble x,
if (focus->device == device)
{
- gtk_pointer_focus_free (focus);
window->priv->foci =
g_list_delete_link (window->priv->foci, cur);
+ gtk_pointer_focus_unref (focus);
}
}
}
{
GtkWindowPrivate *priv = window->priv;
- priv->foci = g_list_prepend (priv->foci, focus);
+ priv->foci = g_list_prepend (priv->foci, gtk_pointer_focus_ref (focus));
}
static void
GtkPointerFocus *focus)
{
GtkWindowPrivate *priv = window->priv;
+ GList *pos;
+
+ pos = g_list_find (priv->foci, focus);
+ if (!pos)
+ return;
priv->foci = g_list_remove (priv->foci, focus);
+ gtk_pointer_focus_unref (focus);
}
static GtkPointerFocus *
focus = gtk_window_lookup_pointer_focus (window, device, sequence);
if (focus)
{
+ gtk_pointer_focus_ref (focus);
+
if (target)
{
gtk_pointer_focus_set_target (focus, target);
else
{
gtk_window_remove_pointer_focus (window, focus);
- gtk_pointer_focus_free (focus);
}
+
+ gtk_pointer_focus_unref (focus);
}
else if (target)
{
focus = cur->data;
l = cur->next;
+ gtk_pointer_focus_ref (focus);
+
if (GTK_WIDGET (focus->toplevel) == widget)
{
/* Unmapping the toplevel, remove pointer focus */
gtk_window_remove_pointer_focus (window, focus);
- gtk_pointer_focus_free (focus);
}
else if (focus->target == widget ||
gtk_widget_is_ancestor (focus->target, widget))
{
gtk_pointer_focus_repick_target (focus);
}
+
+ gtk_pointer_focus_unref (focus);
}
}